貂哥 Me: 'btnChangePassword': 'Change Password', 'btnToggleAdmin': 'Toggle Admin Mode', 'btnHome': 'Home', 'btnSwitchAccount': 'Switch Account', 'btnSwitchKey': 'Switch Key', 'btnEnterAdmin': 'Enter Admin Panel', 'btnEnterUser': 'Enter User Functions', 'btnAddKey': 'Generate New Key', 'btnRefresh': 'Refresh List', 'btnCleanup': 'Clean Expired', 'adminTitle': 'Key Management Center', 'testCardLabel': 'Generate Test Card', 'testCardInfo': '1 hour validity, 1 account only, unlock achievement only', 'superAdmin': 'Super Admin', 'normalAdmin': 'Normal Admin', 'testCardBadge': 'Test Card', 'testCardStatus': 'Test Card User', 'testCardEmailWarning': 'Test card does not support email change. Please contact admin for paid full features!', 'testCardPasswordWarning': 'Test card does not support password change. Please contact admin for paid full features!' } }; // ==================== 全局变量 ==================== let currentLanguage = 'zh-CN'; let currentKey = null; let currentToken = null; let currentExpiryTime = null; let currentUser = null; let isAdminMode = false; let isSuperAdmin = false; let currentBindInfo = null; let isTestCard = false; // ==================== 工具函数 ==================== function updateStatus(message, isError = false) { const statusEl = document.getElementById('statusMessage'); const icon = isError ? 'fa-exclamation-circle' : 'fa-check-circle'; statusEl.innerHTML = ${message}; if (isTestCard) { statusEl.className = 'cyber-status error'; } else if (isAdminMode) { statusEl.className = 'cyber-status admin'; } else { statusEl.className = 'cyber-status ' + (isError ? 'error' : 'success'); } } function setButtonLoading(buttonId, loading) { const button = document.getElementById(buttonId); if (loading) { button.disabled = true; const originalText = button.querySelector('span').innerHTML; button.innerHTML = 加载中...; button.setAttribute('data-original-text', originalText); } else { button.disabled = false; const originalText = button.getAttribute('data-original-text'); if (originalText) { button.innerHTML = originalText; } } } function logAction(action, message, type = 'info') { const logHistory = document.getElementById('logHistory'); const now = new Date().toLocaleTimeString('zh-CN', { hour12: false }); let icon = 'fa-info-circle'; let color = 'var(--cyber-blue)'; switch(type) { case 'success': icon = 'fa-check-circle'; color = 'var(--cyber-green)'; break; case 'error': icon = 'fa-times-circle'; color = 'var(--cyber-red)'; break; case 'warning': icon = 'fa-exclamation-triangle'; color = 'var(--cyber-yellow)'; break; } const logItem = document.createElement('div'); logItem.className = 'log-item'; logItem.innerHTML = ${now} [${action}] ${message}; logHistory.prepend(logItem); // 保持日志数量在15条以内 while (logHistory.children.length > 15) { logHistory.removeChild(logHistory.lastChild); } } // ==================== 核心功能函数 ==================== async function handleCheckKey(key = null) { key = key || document.getElementById('accessKey').value.trim(); if (!key) { updateStatus('请输入秘钥!', true); return; } setButtonLoading('btnCheckKey', true); updateStatus('正在验证秘钥,请稍候...', false); try { const email = document.getElementById('email') ? document.getElementById('email').value.trim() : null; const response = await fetch(`${API_BASE_URL}/check-key`, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ key, email }) }); const data = await response.json(); if (!data.success) { throw new Error(data.message || "验证失败"); } // 保存当前秘钥信息 currentKey = key; currentExpiryTime = data.expiryTime; isAdminMode = data.isAdmin; isSuperAdmin = data.isSuperAdmin || false; isTestCard = data.isTestCard || false; // 更新绑定信息显示 updateBindInfo(data.bindCount, data.maxBind, data.remainingBinds); if (data.isAdmin) { // 管理员模式 if (data.needsChoice) { // 需要选择进入用户还是管理面板 document.getElementById('adminChoice').style.display = 'block'; document.getElementById('keyForm').style.display = 'none'; updateStatus(data.message, false); logAction("管理员验证", "管理员模式选择", 'success'); return; } // 直接进入管理员模式 document.getElementById('toggleAdminModeBtn').style.display = 'block'; updateStatus(data.message, false); switchSection('menuButtons', ['keyForm', 'loginForm']); logAction("管理员登录", ${isSuperAdmin ? '超级' : ''}管理员模式启用, 'success'); } else { // 普通用户模式 updateExpiryDisplay(data.expiryTime, data.durationHours, data.cardType); if (data.isEmailBound && email) { updateStatus(`邮箱 ${email} 已绑定此秘钥,可以直接登录!`, false); } else if (data.remainingBinds <= 0) { updateStatus("秘钥绑定已满!但已绑定的账号仍可登录。", true); } else { updateStatus(data.message, false); } switchSection('loginForm', ['keyForm', 'menuButtons']); logAction("秘钥验证", "秘钥验证成功", 'success'); } } catch (error) { updateStatus(`验证失败:${error.message}`, true); logAction("秘钥验证", 验证失败:${error.message}, 'error'); } finally { setButtonLoading('btnCheckKey', false); } } // ==================== 修复的登录函数 ==================== async function handleLogin() { const email = document.getElementById('email').value.trim(); const password = document.getElementById('password').value; if (!email || !password) { updateStatus("请输入邮箱和密码!", true); return; } setButtonLoading('btnLogin', true); updateStatus("正在登录...", false); try { // 准备请求数据 - 确保传递 currentKey const requestData = { email: email, password: password, key: currentKey // 确保传递当前秘钥 }; const response = await fetch(`${API_BASE_URL}/login`, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify(requestData) }); const data = await response.json(); if (!data.success) { throw new Error(data.message || "登录失败"); } currentToken = data.data.idToken; currentUser = data.data.email; // 保存到本地存储 saveAuthToStorage(currentKey, currentToken, currentExpiryTime, currentUser); updateStatus("登录成功!进入功能菜单。", false); switchSection('menuButtons', ['keyForm', 'loginForm']); logAction("用户登录", 用户 ${currentUser} 登录成功, 'success'); } catch (error) { updateStatus(`登录失败:${error.message}`, true); logAction("用户登录", 登录失败:${error.message}, 'error'); } finally { setButtonLoading('btnLogin', false); } } // ==================== 其他功能函数 ==================== async function handleKingRank() { if (!currentToken || !currentKey) { updateStatus("请先登录!", true); handleLogout(true); return; } logAction("等级设置", "开始尝试设置国王等级...", 'info'); updateStatus("正在尝试设置国王等级...", false); try { const response = await fetch(`${API_BASE_URL}/king-rank`, { method: "POST", headers: { "Authorization": Bearer ${currentToken} } }); const data = await response.json(); if (!data.success) { throw new Error(data.message || "设置失败"); } logAction("等级设置", "国王等级设置成功", 'success'); updateStatus(data.message, false); } catch (error) { updateStatus(`等级设置失败:${error.message}`, true); logAction("等级设置", 设置失败: ${error.message}, 'error'); } } async function handleChangeEmail() { if (!currentToken || !currentKey) { updateStatus("请先登录!", true); handleLogout(true); return; } if (isTestCard) { alert("测试卡不支持修改邮箱功能,请联系管理员付费使用完整功能!"); return; } const newEmail = prompt(`请输入新的邮箱地址(当前: ${currentUser}):`); if (!newEmail) return; logAction("修改邮箱", 正在尝试修改邮箱至 ${newEmail}..., 'info'); updateStatus("正在修改邮箱...", false); try { const response = await fetch(`${API_BASE_URL}/change-email`, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ idToken: currentToken, newEmail: newEmail, oldEmail: currentUser, key: currentKey }) }); const data = await response.json(); if (!data.success) { throw new Error(data.message || "修改失败"); } currentToken = data.data.idToken; const oldUser = currentUser; currentUser = data.data.email; saveAuthToStorage(currentKey, currentToken, currentExpiryTime, currentUser);